/**
 * 
 */
package org.yelongframework.model.generator.freemarker.bean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.yelongframework.commons.lang.StringUtil;
import org.yelongframework.freemarker.EntityMap;
import org.yelongframework.freemarker.FreeMarkerConfigurationFactory;
import org.yelongframework.model.generator.freemarker.AbstractFreemarkerModelGenerator;
import org.yelongframework.model.generator.freemarker.datamodel.ModelGenModelDataModel;
import org.yelongframework.model.generator.freemarker.datamodel.ModelGenModelDataModelBuilder;
import org.yelongframework.model.generator.freemarker.datamodel.ModelGenModelFieldDataModel;
import org.yelongframework.model.generator.manager.GenModelAndTable;
import org.yelongframework.model.generator.manager.utils.GenModelAndTableUtils;
import org.yelongframework.model.generator.model.MapModelGenerator;
import org.yelongframework.model.map.MapModel;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 默认的map模型生成器
 * 
 * @since 1.0.0
 */
public class DefaultFreemarkerMapModelGenerator extends AbstractFreemarkerModelGenerator implements MapModelGenerator {

	/** 配置 */
	private static final Configuration CONFIGURATION = FreeMarkerConfigurationFactory
			.createConfigurationByClass(DefaultFreemarkerMapModelGenerator.class);

	/** 模板名称 */
	private static final String FTL_NAME = "mapModel.ftl";

	// ==================================================构造器==================================================

	/**
	 * @param modelGenModelDataModelBuilder 模板模型工厂
	 */
	public DefaultFreemarkerMapModelGenerator(ModelGenModelDataModelBuilder modelGenModelDataModelBuilder) {
		super(modelGenModelDataModelBuilder);
	}

	// ==================================================数据模型==================================================

	@Override
	protected Map<String, Object> buildDataModel(ModelGenModelDataModel modelGenModelDataModel) {
		GenModelAndTable genModelAndTable = modelGenModelDataModel.getGenModelAndTable();
		String superClassName = modelGenModelDataModel.getSuperClassName();
		// 默认为MapModel
		if (StringUtils.isBlank(superClassName)) {
			modelGenModelDataModel.setSuperClassName(MapModel.class.getName());
		}
		String superClassPackageName = modelGenModelDataModel.getSuperClassSimpleName();
		// 默认为MapModel
		if (StringUtils.isBlank(superClassPackageName)) {
			modelGenModelDataModel.setSuperClassSimpleName(MapModel.class.getSimpleName());
		}
		EntityMap<ModelGenModelDataModel> entityTModel = new EntityMap<>(modelGenModelDataModel);
		List<ModelGenModelFieldDataModel> modelFields = modelGenModelDataModel.getModelFields();
		List<EntityMap<ModelGenModelFieldDataModel>> entityTModelFields = new ArrayList<EntityMap<ModelGenModelFieldDataModel>>(
				modelFields.size());
		for (ModelGenModelFieldDataModel tModelField : modelFields) {
			EntityMap<ModelGenModelFieldDataModel> entityTModelField = new EntityMap<ModelGenModelFieldDataModel>(
					tModelField);
			String camelCaseToUnderscore = StringUtil.camelCaseToUnderscore(tModelField.getCode());
			entityTModelField.put("staticFinalFieldName", (camelCaseToUnderscore + "_fieldName").toUpperCase());
			entityTModelField.put("columnName", tModelField.getGenFieldAndColumn().getColumnName());
			entityTModelFields.add(entityTModelField);
		}
		entityTModel.put("modelFields", entityTModelFields);
		Map<String, Object> root = new HashMap<>();
		root.put("model", entityTModel);
		root.put("existDateField", GenModelAndTableUtils.existDateField(genModelAndTable));
		return root;
	}

	// ==================================================模板==================================================

	@Override
	protected Template getTemplate() throws Exception {
		return CONFIGURATION.getTemplate(FTL_NAME, "UTF-8");
	}

}
